package com.cb2.algorithm.leetcode;

/**
 * <a href='https://leetcode.cn/problems/reverse-words-in-a-string'>反转字符串中的单词(Reverse Words in a String)</a>
 * <p>给你一个字符串 s ，请你反转字符串中<b>单词</b>的顺序。</p>
 * <p>单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的<b>单词</b>分隔开。</p>
 * <p>返回<b>单词</b>顺序颠倒且<b>单词</b>之间用单个空格连接的结果字符串。</p>
 * <p>注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：s = "the sky is blue"
 *      输出："blue is sky the"
 *
 *  示例 2：
 *      输入：s = "  hello world  "
 *      输出："world hello"
 *      解释：反转后的字符串中不能存在前导空格和尾随空格。
 *
 *  示例 3：
 *      输入：s = "a good   example"
 *      输出："example good a"
 *      解释：如果两个单词间有多余的空格，反转后的字符串需要将单词间的空格减少到仅有一个。
 * </pre>
 * </p>
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= s.length <= 10^4</li>
 *     <li>s 包含英文大小写字母、数字和空格' '</li>
 *     <li>s 中 至少存在一个 单词</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2025/2/7 15:31
 */
public class LC0151ReverseWordsInAString_M {
    static class Solution {
        public String reverseWords(String s) {
            char[] chars = s.trim().toCharArray();
            StringBuilder res = new StringBuilder();
            StringBuilder tempStr = new StringBuilder();
            for (int i = chars.length - 1; i >= 0; --i) {
                if (chars[i] == ' ') {
                    if (tempStr.length() != 0) {
                        res.append(tempStr.reverse()).append(" ");
                        tempStr = new StringBuilder();
                    }
                } else {
                    tempStr.append(chars[i]);
                }
            }
            // 处理剩下的字符串
            return res.append(tempStr.reverse()).toString();
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.reverseWords("the sky is blue"));
        System.out.println(solution.reverseWords("  hello world  "));
        System.out.println(solution.reverseWords("a good   example"));
    }
}
